package org.taskexecution.taskexecution.task;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author Lydond
 * @description: 任务调度器
 * @create_date: 2025/10/20-15:00
 */
@Service
public class TaskDispatcher {

    // 1. 自动注入所有实现了 ITaskHandler 接口的 Spring Bean
    @Autowired
    private List<ITaskHandler> handlers;

    // 2. 任务注册表 (Key: task_key, Value: 对应的Handler实例)
    private Map<String, ITaskHandler> handlerRegistry;

    // 3. Spring 启动后，自动构建这个注册表
    @PostConstruct
    public void init() {
        // Java Stream: 将 List 转换为 Map, Key 是 task_key, Value 是 handler 实例
        handlerRegistry = handlers.stream()
                .collect(Collectors.toConcurrentMap(ITaskHandler::getTaskKey, Function.identity()));

        System.out.println("任务处理器加载完毕，共 " + handlerRegistry.size() + " 个。");
    }

    /**
     * 调度器调用的入口
     * * @param taskKey 任务Key
     *
     * @param taskParams 任务参数 (JSON 字符串)
     * @return 执行结果
     * @throws Exception 执行异常
     */
    public Object dispatch(String taskKey, String taskParams) throws Exception {
        // 4. 根据 taskKey 查找处理器
        ITaskHandler handler = handlerRegistry.get(taskKey);

        if (handler == null) {
            throw new IllegalArgumentException("未找到任务处理器: " + taskKey);
        }

        // 5. 【核心】执行 handler，并传入原始的 JSON 字符串
        return handler.execute(taskParams);
    }
}